function run_all_demos()
% RUN_ALL_DEMOS 运行所有矩阵计算演示
% 
% 这个脚本提供了一个统一的入口来运行所有章节的演示代码

fprintf('=== 矩阵计算课程演示系统 ===\n\n');

while true
    fprintf('请选择要运行的内容:\n');
    fprintf('1. 第1章 - 导引 (线性代数回顾、浮点运算、误差分析)\n');
    fprintf('2. 第2章 - 线性系统和LU分解\n');
    fprintf('3. 第3章 - 最小二乘和QR分解\n');
    fprintf('4. 第4章 - 特征值和特征向量\n');
    fprintf('5. 第5章 - 正定和半正定矩阵\n');
    fprintf('6. 第6章 - 奇异值分解(SVD)\n');
    fprintf('7. 实验1 - LU分解实验\n');
    fprintf('8. 实验2 - QR分解实验\n');
    fprintf('9. 实验3 - 特征值算法实验\n');
    fprintf('10. 实验4 - SVD应用实验\n');
    fprintf('11. 运行所有演示\n');
    fprintf('0. 退出\n\n');
    
    choice = input('请输入选择 (0-11): ');
    
    switch choice
        case 1
            run_chapter1_demos();
        case 2
            run_chapter2_demos();
        case 3
            run_chapter3_demos();
        case 4
            run_chapter4_demos();
        case 5
            run_chapter5_demos();
        case 6
            run_chapter6_demos();
        case 7
            run_experiment1();
        case 8
            run_experiment2();
        case 9
            run_experiment3();
        case 10
            run_experiment4();
        case 11
            run_all_chapters();
        case 0
            fprintf('感谢使用矩阵计算演示系统！\n');
            break;
        otherwise
            fprintf('无效选择，请重新输入。\n\n');
    end
    
    if choice ~= 0
        fprintf('\n按任意键继续...\n');
        pause;
        clc;
    end
end

end

function run_chapter1_demos()
fprintf('\n=== 第1章演示 ===\n');
try
    fprintf('1. 线性代数回顾...\n');
    addpath('01-introduction');
    linear_algebra_review();
    
    fprintf('\n2. 浮点运算演示...\n');
    floating_point_demo();
    
    fprintf('\n3. 误差分析...\n');
    error_analysis();
    
    fprintf('\n4. 条件数分析...\n');
    condition_number();
    
    fprintf('\n第1章演示完成！\n');
catch ME
    fprintf('运行第1章演示时出错: %s\n', ME.message);
end
end

function run_chapter2_demos()
fprintf('\n=== 第2章演示 ===\n');
try
    addpath('02-linear-systems-lu');
    
    fprintf('1. 三角系统求解...\n');
    triangular_systems();
    
    fprintf('\n2. 高斯消元法...\n');
    gaussian_elimination();
    
    fprintf('\n3. LU分解...\n');
    lu_decomposition();
    
    fprintf('\n4. LU分解选主元...\n');
    lu_pivoting();
    
    fprintf('\n5. Cholesky分解...\n');
    cholesky_decomposition();
    
    fprintf('\n6. 带状系统...\n');
    banded_systems();
    
    fprintf('\n第2章演示完成！\n');
catch ME
    fprintf('运行第2章演示时出错: %s\n', ME.message);
end
end

function run_chapter3_demos()
fprintf('\n=== 第3章演示 ===\n');
try
    addpath('03-least-squares-qr');
    
    fprintf('1. 最小二乘问题介绍...\n');
    least_squares_intro();
    
    fprintf('\n2. Gram-Schmidt QR分解...\n');
    gram_schmidt_qr();
    
    fprintf('\n3. Householder QR分解...\n');
    householder_qr();
    
    fprintf('\n4. Givens旋转QR分解...\n');
    givens_qr();
    
    fprintf('\n5. 正规方程法...\n');
    normal_equations();
    
    fprintf('\n6. QR最小二乘求解...\n');
    qr_least_squares();
    
    fprintf('\n第3章演示完成！\n');
catch ME
    fprintf('运行第3章演示时出错: %s\n', ME.message);
end
end

function run_chapter4_demos()
fprintf('\n=== 第4章演示 ===\n');
try
    addpath('04-eigenvalues');
    
    fprintf('1. 特征值基础...\n');
    eigenvalue_basics();
    
    fprintf('\n2. 幂迭代法...\n');
    power_iteration();
    
    fprintf('\n3. QR迭代法...\n');
    qr_iteration();
    
    fprintf('\n第4章演示完成！\n');
catch ME
    fprintf('运行第4章演示时出错: %s\n', ME.message);
end
end

function run_chapter5_demos()
fprintf('\n=== 第5章演示 ===\n');
try
    addpath('05-positive-semidefinite');
    
    fprintf('1. 正定矩阵基础...\n');
    positive_definite_basics();
    
    fprintf('\n第5章演示完成！\n');
catch ME
    fprintf('运行第5章演示时出错: %s\n', ME.message);
end
end

function run_chapter6_demos()
fprintf('\n=== 第6章演示 ===\n');
try
    addpath('06-svd');
    
    fprintf('1. SVD基础...\n');
    svd_basics();
    
    fprintf('\n第6章演示完成！\n');
catch ME
    fprintf('运行第6章演示时出错: %s\n', ME.message);
end
end

function run_experiment1()
fprintf('\n=== 实验1: LU分解实验 ===\n');
try
    addpath('experiments/exp1-lu');
    addpath('02-linear-systems-lu');
    lu_experiment();
    fprintf('\n实验1完成！\n');
catch ME
    fprintf('运行实验1时出错: %s\n', ME.message);
end
end

function run_experiment2()
fprintf('\n=== 实验2: QR分解实验 ===\n');
try
    addpath('experiments/exp2-qr');
    addpath('03-least-squares-qr');
    qr_experiment();
    fprintf('\n实验2完成！\n');
catch ME
    fprintf('运行实验2时出错: %s\n', ME.message);
end
end

function run_experiment3()
fprintf('\n=== 实验3: 特征值算法实验 ===\n');
try
    addpath('experiments/exp3-eigenvalues');
    addpath('04-eigenvalues');
    eigenvalue_experiment();
    fprintf('\n实验3完成！\n');
catch ME
    fprintf('运行实验3时出错: %s\n', ME.message);
end
end

function run_experiment4()
fprintf('\n=== 实验4: SVD应用实验 ===\n');
try
    addpath('experiments/exp4-svd');
    addpath('06-svd');
    svd_experiment();
    fprintf('\n实验4完成！\n');
catch ME
    fprintf('运行实验4时出错: %s\n', ME.message);
end
end

function run_all_chapters()
fprintf('\n=== 运行所有演示 ===\n');
fprintf('这将运行所有章节的演示，可能需要较长时间...\n');
response = input('确定要继续吗？(y/n): ', 's');

if strcmpi(response, 'y') || strcmpi(response, 'yes')
    run_chapter1_demos();
    fprintf('\n按任意键继续到第2章...\n'); pause;
    
    run_chapter2_demos();
    fprintf('\n按任意键继续到第3章...\n'); pause;
    
    run_chapter3_demos();
    fprintf('\n按任意键继续到第4章...\n'); pause;
    
    run_chapter4_demos();
    fprintf('\n按任意键继续到第5章...\n'); pause;
    
    run_chapter5_demos();
    fprintf('\n按任意键继续到第6章...\n'); pause;
    
    run_chapter6_demos();
    
    fprintf('\n=== 所有演示完成！===\n');
else
    fprintf('已取消运行所有演示。\n');
end
end